import com.beust.jcommander.DynamicParameter;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.*;

import java.util.stream.Stream;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 23735
 * Date: 2023-01-21
 * Time: 23:14
 */

/**
 * 参数化
 */
public class Parameterized {
    /**
     * 单参数
     */
    @ParameterizedTest
    // 有了@ParameterizedTest, 就不需要再添加 @Test, 否则会多执行一遍
    @ValueSource(strings={"abc", "efg", "hij"})
    // 注意使用原生类型, ints, strings, floats, doubles
    public void singleParameter(String str){
        System.out.println(str);
    }

    /**
     * 多参数
     * @param name
     * @param age
     */
    @ParameterizedTest
    @CsvSource(value={"zhangsan,18", "lisi, 20", "wangwu,40"})
    // 默认分隔符是 ,
    public void multiParameters1(String name, int age){
        System.out.println("name: "+name+", age: "+age);
    }

    /**
     * 自定义分隔符
     * @param name
     * @param age
     */
    @ParameterizedTest
    @CsvSource(value={"zhangsan-18", "lisi-20", "wangwu-40"}, delimiterString = "-")
    // 指定分隔符是 -
    public void multiParameters2(String name, int age){
        System.out.println("name: "+name+", age: "+age);
    }

    /**
     * 使用当前项目中的文件
     * @param name
     * @param age
     */
    @ParameterizedTest
    @CsvFileSource(resources = "/my.csv")
    // 使用当前项目中, resources 目录中的 my.csv 文件, 注意文件中的写法, 以,分隔开, 不要忘了
    public void csvFileSources1(String name, int age){
        System.out.println("name: "+name+", age: "+age);
    }

    /**
     * 使用任意文件
     * @param name
     * @param age
     */
    @ParameterizedTest
    @CsvFileSource(files = "D:\\DevelopTool\\JAVA\\IDEA\\javaProject\\test-lesson\\JunitGrammar\\src\\main\\java\\my.csv")
    // 使用当前项目中, resources 目录中的 my.csv 文件, 注意文件中的写法, 以,分隔开, 不要忘了
    public void csvFileSources2(String name, int age){
        System.out.println("name: "+name+", age: "+age);
    }


    /**
     * 动态参数, 单参数
     * @param name
     */
    @ParameterizedTest
    @MethodSource("method") // 指定使用哪个静态方法返回的值作为参数
    public void dynamicTest1(String name){
        System.out.println(name);
    }
    // 注意这个方法必须是静态的
    // 这里是以 Stream 流的方式返回了, 也可以以其他的方式返回
    static Stream<String> method(){
        return Stream.of("lucy","lily", "Jhon");
    }


    /**
     * 动态参数, 多参数
     * @param name
     * @param age
     */
    @ParameterizedTest
    @MethodSource // 不写参数, 会自动找 同名的静态方法返回的值作为参数
    public void dynamicTest2(String name, int age){ //注意参数为 int 类型的, 不能为空
        System.out.println("name: "+name+", age: "+age);
    }

    static Stream<Arguments> dynamicTest2(){
        return Stream.of(Arguments.arguments("zhangsan",15),
                Arguments.arguments("lisi",16),
                Arguments.arguments("wangwu",17));// 注意这里字符串和int 是分开写的
    }
}
